#include <iostream>
#include <string>
#include <list>
using namespace std;

// double Division(int a, int b)
// {
//     if(b == 0)
//         throw "Division dy zero condition!";
//     else
//         return ((double)a / (double) b);
// }

// void Func()
// {
//     int len,time;
//     cin >> len >> time;
//     cout << Division(len,time) << endl;
// }

// int main()
// {
//     try
//     {
//         Func();
//     }
//     catch(const char* errmsg)
//     {
//         cout << errmsg << endl;
//     }
//     catch(...)
//     {
//         cout << "未知错误" << endl;
//     }
//     return 0;
// }


// int main()
// {
//     int* pa = new int(7);
//     cout << pa[0] << endl;
//     return 0;
// }

template <class T>
class SmartPtr
{
public:
    SmartPtr(T* ptr):_ptr(ptr)
    {}
    ~SmartPtr()
    {
        cout << "~SmartPtr()" << endl;
        delete _ptr;
    }

    T& operator*()
    {
        return *_ptr;
    }

    T* operator->()
    {
        return _ptr;
    }

private:
    T* _ptr;
};

int div()
{
    int a,b;
    cin >> a >> b;
    if(b == 0)
     throw invalid_argument("除零错误\n");
    return a / b;
}

// void Func()
// {
//     SmartPtr<int> sp1(new int(1));
//     SmartPtr<int> sp2(new int(2));

//     SmartPtr<pair<string,int>> sp3(new pair<string,int>);
//     sp3->first = "苹果";
//     sp3->second = 1;
//     cout << div() << endl;
// }


// int main()
// {
//     try
//     {
//         Func();
//     }
//     catch(const std::exception& e)
//     {
//         std::cerr << e.what() << '\n';
//     }
    
//     return 0;
// }


// namespace dit
// {
//     template <class T>
//     class auto_ptr
//     {
//     public:
//         auto_ptr(T* ptr):_ptr(ptr)
//         {}

//         auto_ptr(auto_ptr<T>& ap)
//         {
//             _ptr = ap->_ptr;
//             ap->_ptr = nullptr;
//         }

//         ~auto_ptr()
//         {
//             cout << "~auto_ptr()" << endl;
//             delete _ptr;
//         }

//         T& operator*()
//         {
//             return *_ptr;
//         }

//         T* operator->()
//         {
//             return _ptr;
//         }

//     private:
//         T* _ptr;
//     };

// }
#include <memory>

int main()
{
    unique_ptr<int> sp1(new int(1));
    
    return 0;
}


